/**
 * 树节点
 *
 * 对于树形组件，我们希望用一种统一的方式进行处理，
 *
 * 所有的数据，都需要转换成这种标准格式，才能接入各种组件。
 *
 * 注意：尽量保证数据准确性，如果子节点指向父节点，在计算的时候，会产生无限递归（代码在可预见的场景中，做了一定处理）。
 */
export default class TreeNode {
    /**
     * 自身 ID
     */
    id;

    /**
     * 父级 ID
     */
    pid;

    /**
     * 数据类型
     */
    type;

    /**
     * 节点名称
     */
    label;

    /**
     * 图标（可以是 icon，也可以是图片地址）
     */
    icon;

    /**
     * 树的层级（暂时没有解析这一字段，因此一般是 undefined）
     */
    level;

    /**
     * 原始数据
     */
    data;

    /**
     * 是否选中
     */
    checked;

    /**
     * 经过模糊检索等算法，过滤之后剩下的节点，算法上需要的标记位
     */
    hit;

    /**
     * 父节点（暂时定为对象，实际一个节点可能属于多个父节点，目前这个字段只是用于寻找根节点，这不会引起什么问题）
     */
    parent;

    /**
     * 子节点
     */
    children;

    /**
     * 是否有父节点
     */
    hasParent() {
        return this.parent !== undefined;
    }

    /**
     * 是否有子节点
     *
     * @returns {boolean}
     */
    hasChildren() {
        return this.children !== undefined && this.children != null && this.children.length > 0;
    }
}